iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
佛心分享-IT 人自學之術

C++探險家系列 第 21

Day 21 排序與搜尋

  • 分享至 

  • xImage
  •  

排序
定義:排序是將資料依照某種順序(如升序或降序)排列的過程。
常見排序演算法:
1.冒泡排序:重複比較相鄰元素,交換順序錯誤的元素。
2.選擇排序:每次找到最小的元素放到序列的前端。
3.插入排序:將每個元素插入到已排序部分的正確位置。
4.快速排序:選擇基準點,分割資料並遞迴排序。
5.合併排序:分割資料並將排序後的小部分合併。

搜尋
定義:搜尋是在資料集中找到特定元素的過程。

  • 常見搜尋演算法:
    1.線性搜尋:從頭到尾逐個檢查每個元素。
    2.二分搜尋:針對已排序的資料,每次將搜尋範圍縮小一半。

程式練習題(Insertion sort):

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
void sort(int [ ],int);
int main(void)
{
    int i,a[30];
    srand(time(NULL));
    for(i=0;i<30;i++)a[i]=rand()%100;
    for(i=0;i<30;i++)cout<<a[i]<<" ";
    cout<<endl;
    sort(a,30);
    for(i=0;i<30;i++)cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}
void sort (int a[ ],int n)
{
    int i,j,npw;
    for(i=1;i<n;i++){
        now = a[i];
        for(j=i-1;j>=0 && now<a[j];j--)
            a[j+1]=a[j];
        a[j+1] = now;
    }
}

說明:插入排序法對一個隨機生成的 30 個整數的陣列進行排序,透過 rand() 生成隨機數,然後使用 sort() 函數進行排序。插入排序的過程是遍歷陣列中的每個元素,將其插入到已排序的部分中,使整個陣列保持有序。程式最後會輸出排序前和排序後的陣列內容,展示排序結果。

程式練習題(Bubble sort):

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

#define SIZE 20

int main(void)
{
    int a[SIZE];
    int i, j, num, temp;
    srand(time(NULL));

    cout << "How many do you want (less than " << SIZE << "): ";
    cin >> num;

    for (i = 0; i < num; i++)
        a[i] = rand() % 100;

    for (i = 0; i < num - 1; i++) {
        for (j = 1; j < num; j++) {
            if (a[j - 1] > a[j]) {
                temp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = temp;
            }
        }
    }

    for (i = 0; i < num; i++) 
        cout << a[i] << " ";

    return 0;
}

說明:
首先生成小於 20 個的隨機數並儲存在陣列中,接著透過雙層迴圈進行氣泡排序,逐一比較相鄰的元素並進行交換,直到將陣列按升序排列。內層迴圈每次將最大的數移動到末尾,外層迴圈逐漸縮小未排序部分的範圍。最後,輸出排序後的陣列內容。

程式練習題(Sequential search)

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

int search(int[], int, int);

int main(void)
{
    int i, a[30], key, result;
    cout << "欲搜尋的值:";
    cin >> key;

    srand(time(NULL));
    for (i = 0; i < 30; i++) 
        a[i] = rand() % 10;

    result = search(a, 30, key);
    if (result == -1)
        cout << "Not found!" << endl;
    else
        cout << "Found in index " << result << endl;

    return 0;
}

int search(int a[], int n, int key)
{
    for (int i = 0; i < n; i++)
        if (a[i] == key)
            return i;
    return -1;
}

說明:
隨機生成 30 個 0 到 9 的整數,並讓使用者輸入要搜尋的數字,透過線性搜尋找到數字在陣列中的索引位置。search() 函數遍歷陣列,若找到與輸入的數字相同的元素,返回其索引;若未找到則返回 -1,並在主程式中根據結果輸出「Found」或「Not found」。

!!以上內容是跟著第一次學C++第二版第15章一起做學習的!!


上一篇
Day 20 類別續集概念
下一篇
Day 22 堆疊與佇列
系列文
C++探險家30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言